MySQL 约束和级联操作
什么是约束及为什么要使用约束?
- 约束实际上就是表中数据的限制条件
- 表在设计的时候加上约束的目的是为了保证表中的记录完整和有效
常用约束
添加约束的时机
- 创建表时
- 修改表时
语法:
create table 表名(
字段名 字段类型 约束
)
- not null:非空,用于保证该字段的值不能为空
- default:设置默认值
字段名 varchar(255) default 默认值
- primary key:主键,唯一,用于保证该字段的值具有唯一性,并且非空
- unique:可以有多个,保证该字段具有唯一性(可以有一个 null)
- foreign key:外键,用于限制两个表的关系,用于保证该字段的值必须来自于主键
foreign key(字段名) references 表2(字段名)
- check:约束 CHECK 约束用于限制列中的值的范围。CHECK 约束可以应用于一个或者多个列,也可以将多个CHECK 约束应用于一个列。
CHECK 约束
-- 下面的 SQL 在 "Persons" 表创建时为 "Id_P" 列创建 CHECK 约束。CHECK 约束规定 "Id_P" 列必须只包含大于 0 的整数。
CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CHECK (Id_P>0)
)
自增长列
又称为 标识列
可以不用手动的插入值,系统提供默认的序列值
就一个: auto_increment
关键字
Example
CREATE TABLE animals (
id MEDIUMINT NOT NULL AUTO_INCREMENT,
name CHAR(30) NOT NULL,
PRIMARY KEY (id)
);
语法:
create table 表名(
id int 约束 auto_increment
);
- 一个表只能有一个标识列
- 标识列的类型只能是数值型
主键外键
CREATE TABLE Orders
(
字段名1 int NOT NULL,
字段名2 int NOT NULL UNIQUE,
字段名3 varchar(255) default 默认值,
字段名4 int,
PRIMARY KEY (字段名1),
FOREIGN KEY (字段名4) REFERENCES 表2(表2的字段)
)
主键约束
主键约束(primary key 简称PK)
主键分类:
根据字段分:
- 单一主键:给一个字段添加主键约束
- 复合主键:给多个字段联合添加一个主键约束
无论是单一主键还是复合主键,一张表主键约束只能有一个。
根据性质分:
- 自然主键:主键是一个自然数,这个自然数和当前表的业务没有任何关系
- 业务主键:主键值和当前表中业务紧密相关,当业务数据发生改变时,主键值通常会受到影响,所以不建议使用。
例:
-- 单一主键:
-- 列级约束:
create table t_user(
id int(10) primary key,
name varchar(32)
);
-- 表级约束:(起名)
create table t_user(
id int(10),
name varchar(32),
-- 这个 constraint 关键字可以省略
constraint t_user_id_pk primary key(id)
);
-- 复合主键:(只能使用表级约束)
create table t_user(
id int(10),
name varchar(32),
email varchar(128),
primary key(id,name)
);
-- 也可以起名:
create table t_user(
id int(10),
name varchar(32),
email varchar(128),
constraint t_user_id_name_pk primary key(id,name)
);
外键约束
外键约束(foreign key 简称FK)
分类:
- 单一外键:给一个字段添加外键约束
- 复合外键:给多个字段联合添加一个外键约束
一张表中可以有多个外键字段
create table t_class(
cno int(3) primary key,
cname varchar(128) not null unique
);
create table t_student(
sno int(3) primary key,
sname varchar(32) not null,
classno int(3),
constraint t_student_classno_fk foreign key(classno) references t_class(cno)
);
级联更新与删除
在删除父表中的数据的时候,级联删除子表中的数据 on delete cascade;
在更新父表中的数据时候,级联更新子表中的数据 on update cascade;
-- 级联操作在外键约束后面添加
alter table t_student add
constraint t_student_classno_fk
foreign key(classno) references t_class(cno) on delete cascade;
alter table t_student add
constraint t_student_classno_fk
foreign key(classno) references t_class(cno) on update cascade;
级联操作要谨慎使用,因为级联操作会将数据改变或者删除